const Router = require('koa-router');
const router = new Router({
  prefix: '/v1/test-v'
});
const {PositiveIntegerValidator} = require('../../validator');

router.post('/:a', async (ctx, next) => {
  const path = ctx.request.params;
  const query = ctx.request.query;
  const headers = ctx.request.header;
  const body = ctx.request.body;

  /* 以下属性会作为validate要检验的数据的来源
      {
          body: ctx.request.body,
          query: ctx.request.query,
          path: ctx.params,
          header: ctx.request.header
      }
  */

  // PositiveIntegerValidator 要求请求参数中必须要有一个id属性 且这个属性的值为正整数
  /** ↓7. alias别名*/
  const v = await new PositiveIntegerValidator().validate(ctx, {x: 'y'}/*←这样属性y就能够使用属性x定义的规则,而无需再手动给属性y创建一份规则*/);
  // 如果校验不通过 不会执行到↓面 会直接返回了一个 http_exception


  /** 1. 如果校验通过 我们可以通过返回的v 拿到上面提到的4种参数(path、query、headers、body)*/
  let id = v.get('body.id', false/*不进行转化*/);
  console.log('id:', id);
  const a = v.get('path.a');
  console.log(a);
  /** 2. 如果你在定义的validator中指定了id是个isInt 会自动转换为数字类型*/
  console.log(typeof id); // string
  id = v.get('body.id');
  console.log(typeof id); // number
  /** 5. isOptional*/
  // 详见 PositiveIntegerValidator
  /** id是optional的详见PositiveIntegerValidator 只在parsed为true时 定义规则时设置的默认值 这里才能通过v.get拿到*/
  console.log('id:', id);
  /** 3. 支持用户自定义校验 自定义校验的方法名必须以validate开头*/
  // 详见 PositiveIntegerValidator
  /** 4. 支持异步校验 自定义校验的方法名必须以validate开头*/
  // 详见 PositiveIntegerValidator
  /** 6. 校验器可以被继承,子校验器会继承父校验上所有属性的校验*/


  ctx.body = 'success'
});

module.exports = router;
